/**
 * 
 */
package es.uab.es2.TimeTracker.nucli;

import java.util.ArrayList;
//import java.util.Collection;
import java.util.Date;

/** 
 * Classe abstracte en la qual deriven   
 * <code>projectes</code> i <code>tasques</code>
 * Es la part fundamental per a la realitzaci� 
 * del composite format per 2 primitives com son
 * projectes i tasques en el que els projectes poden ser 
 * una col�lecci� de nous projectes i tots estan considerats 
 * Activitats.
 * @author Jes�s Berm�dez, Ricard Figueras i Abel Rodr�guez
 * @version 30-mar�
 */
public abstract class Activitat {

    
    //**********************Contructors *********************************
    
    /**
     * Contructor amb parametres que es 
     * utilitzat per les classes derivades
     * {@link Projecte} i {@link Tasca}
     * per a la assignaci� de valor als
     * atributs.
     * @param=String nom, nom del projecte o tasca
     * @param=String descr, descripci� del projecte o tasca
     * @param=Projecte pare, asignaci� del projecte pare de
     * la activitat
     * @param=ArrayList<Activitat> arrel, ArrayList inicial on es guardaran 
     * tots els projectes y tasques.
     */
    public Activitat(final String sNom, final String descr, 
            final Projecte pare, 
            final ArrayList<Activitat> arrel) {
        //invariant
        if (Asserts.asserts[0]) {
            assert (arrel != null);
        }
        //pre-condicio
        if (Asserts.asserts[1]) {
            assert (sNom != null);
            assert (descr != null);
        }
       Identificador ident = Identificador.getInstancia();
       this.projectePare = pare;
       this.id = ident.getContador();
       this.nom = sNom;
       this.descripcio = descr;
       projectePare.getActivitats().add(this);
       //post-condicio
       if (Asserts.asserts[2]) {
           assert (this.nom == sNom);
           assert (this.descripcio == descr);
       }
    }
        
    /**
     * Constructor sense parmetres utilitzat per 
     * asignar valor al projecte arrel.
     */
    public Activitat() {
    }
        
    //********************** Propietats *********************************
    
    /** 
     * Fa referencia a la activiat pare en cas de que  no sigui ella mateixa.
     * @uml.property name="projectePare"
     * @uml.associationEnd multiplicity="(1 1)" 
     * inverse="activitats:es.uab.es2.TimeTracker.nucli.Projecte"
     * 
     */
    protected Projecte projectePare = null;
    
    /**
     * Durada de la activitat, inicialitzada a 0 per defecte 
     * cada 2 segons aquesta variable es actualitzada si hi ha
     * alguna {@link Tasca} cronometrant.
     * 
     * @uml.property  name="durada"
     * 
     */
    private long durada = 0;
    
    /**
     * Data inicial de la activitat, s'inicialitza la primera vegada 
     * que s'inicia el cronometre d'alguna de les tasques
     * incloses en aquest objecte.
     * @uml.property  name="dataInicial"
     */
    private Date dataInicial;

    /**
     * Identificador de la activitat 
     * tota Activitat te el seu propi identificador.
     * Default Value '0'
     * @uml.property  name="id"
     * 
     */
    private int id = 0;
    
    /**
     * Nom de la activitat, aquest a de tenir caracter identificatiu.
     * @uml.property  name="nom"
     */
    private String nom = new java.lang.String();
    
    /**
     * Descripcio de l'activitat per arribar 
     * a entrendre que realitza la activitat 
     * de forma mes detallada.
     * @uml.property  name="descripcio"
     */
    private String descripcio = new java.lang.String();
    
    /**
     * Data final de l'activitat.
     * Aquesta es va actualitzant cada vegada que una
     * {@link Tasca} esta cronometrant. 
     * @uml.property  name="dataFinal"
     */
    private Date dataFinal = null;

    
    
  //********************** Getters & Setters *********************************
	
	/**
	 * Getter of the property <tt>dataInicial</tt>.
	 * @return  Returns the dataInicial.
	 * @uml.property  name="dataInicial"
	 */
	public final Date getDataInicial() {
		return dataInicial;
	}

	/**
	 * Setter of the property <tt>dataInicial</tt>.
	 * @param dataInicial  The dataInicial to set.
	 * @uml.property  name="dataInicial"
	 */
	public final void setDataInicial(final Date dDataInicial) {
	    //pre-condicio
        if (Asserts.asserts[1]) {
            assert (dDataInicial != null);
        }
		this.dataInicial = dDataInicial;
		//Post-condicio
		if (Asserts.asserts[2]) {
		    assert (this.dataInicial == dDataInicial);
		}
	}
	

	/** 
	 * Getter of the property <tt>projectePare</tt>.
	 * @return  Returns the projectePare.
	 * @uml.property  name="projectePare"
	 */
	public final Projecte getProjectePare() {
		return projectePare;
	}

	/** 
	 * Setter of the property <tt>projectePare</tt>.
	 * @param projectePare  The projectePare to set.
	 * @uml.property  name="projectePare"
	 */
	public final void setProjectePare(final Projecte pProjectePare) {
		this.projectePare = pProjectePare;
	}

	/**
     * Getter of the property <tt>dataFinal</tt>.
     * @return  Returns the dataFinal.
     * @uml.property  name="dataFinal"
     */
    public final Date getDataFinal() {
        return dataFinal;
    }

    /**
     * Setter of the property <tt>dataFinal</tt>.
     * @param dataFinal  The dataFinal to set.
     * @uml.property  name="dataFinal"
     */
    public final void setDataFinal(final Date dDataFinal) {
        this.dataFinal = dDataFinal;
    }

    /**
    * Getter of the property <tt>durada</tt>.
    *  @return  Returns the durada.
    * @uml.property  name="durada"
    */
    
    public final long getDurada() {
        return durada;
    }

    /**
    * Setter of the property <tt>durada</tt>.
    * @param durada  The durada to set.
    * @uml.property  name="durada"
    */
    public final void setDurada(final long lDurada) {
        this.durada =  lDurada;
    }
	
	/**
	 * Getter of the property <tt>id</tt>.
	 * @return  Returns the id.
	 * @uml.property  name="id"
	 */
	public final int getId() {
		return id;
	}

	/**
	 * Setter of the property <tt>id</tt>.
	 * @param id  The id to set.
	 * @uml.property  name="id"
	 */
	public final void setId(final int iId) {
		this.id = iId;
	}

	/**
	 * Getter of the property <tt>nom</tt>.
	 * @return  Returns the nom.
	 * @uml.property  name="nom"
	 */
	public final String getNom() {
		return nom;
	}

	/**
	 * Setter of the property <tt>nom</tt>.
	 * @param nom  The nom to set.
	 * @uml.property  name="nom"
	 */
	public final void setNom(final String sNom) {
		this.nom = sNom;
	}

	/**
	 * Getter of the property <tt>descripcio</tt>.
	 * @return  Returns the descripcio.
	 * @uml.property  name="descripcio"
	 */
	public final String getDescripcio() {
		return descripcio;
	}

	/**
	 * Setter of the property <tt>descripcio</tt>.
	 * @param descripcio  The descripcio to set.
	 * @uml.property  name="descripcio"
	 */
	public final void setDescripcio(final String sDescripcio) {
		this.descripcio = sDescripcio;
	}
}
